package com.symaster.common.geom;

import com.symaster.common.geom.entity.Point;
import com.symaster.common.geom.entity.Polygon;
import com.symaster.common.geom.entity.Vector;

import java.io.Serializable;

/**
 * 几何图形需要实现的基础接口
 *
 * @author yinmiao
 * @version 2022-11-02 15:49
 */
public interface Geom extends Serializable {

    /**
     * 判断此集合形状是否为空
     *
     * @return 返回true表示为空否则为false
     */
    boolean isEmpty();

    /**
     * 缩放变换
     *
     * @param center 缩放中心点
     * @param scale  缩放因子
     */
    void scaleTransform(Point center, double scale);

    /**
     * 顺时针旋转此图形
     *
     * @param center 旋转中心点
     * @param angle  旋转角度
     */
    void rotateTransform(Point center, double angle);

    /**
     * 相对位置平移
     *
     * @param vector 移动向量
     */
    void translate(Vector vector);

    /**
     * 相对位置平移
     *
     * @param x x移动的相对距离
     * @param y y移动的相对距离
     */
    void translate(double x, double y);

    /**
     * 移动此几何图形
     *
     * @param dst 移动目标坐标点
     */
    void move(Point dst);

    /**
     * 移动此几何图形, 已左上角点为准
     *
     * @param x 移动目标x坐标值
     * @param y 移动目标y坐标值
     */
    void move(double x, double y);

    /**
     * @return 返回此几何图形的高度
     */
    double height();

    /**
     * @return 返回此几何图形的宽度
     */
    double width();

    /**
     * @return 将此几何图形已多边形形式返回
     */
    Polygon toPolygon();

    /**
     * @return 返回此图形的面积
     */
    double area();

    /**
     * @return 返回此几何图形的中心点
     */
    Point center();

    /**
     * @return 返回此图形左上角的坐标点
     */
    Point point();

    /**
     * @return 返回此图形最小x坐标
     */
    double minX();

    /**
     * @return 返回此几何图形的最小y坐标
     */
    double minY();

    /**
     * @return 返回此几何图形的最大x坐标
     */
    double maxX();

    /**
     * @return 返回此几何图形的最大y坐标
     */
    double maxY();

    void map(GMap gMap);

    interface GMap {
        double handler(double e);
    }
}
